[tool.ruff]
lint.ignore = [    # `ruff rule S101` for a description of that rule
  "B904",     # Within an `except` clause, raise exceptions with `raise ... from err` -- FIX ME
  "B905",     # `zip()` without an explicit `strict=` parameter -- FIX ME
  "E741",     # Ambiguous variable name 'l' -- FIX ME
  "EM101",    # Exception must not use a string literal, assign to variable first
  "EXE001",   # Shebang is present but file is not executable -- DO NOT FIX
  "G004",     # Logging statement uses f-string
  "PLC1901",  # `{}` can be simplified to `{}` as an empty string is falsey
  "PLW060",   # Using global for `{name}` but no assignment is done -- DO NOT FIX
  "PLW2901",  # PLW2901: Redefined loop variable -- FIX ME
  "PT011",    # `pytest.raises(Exception)` is too broad, set the `match` parameter or use a more specific exception
  "PT018",    # Assertion should be broken down into multiple parts
  "RUF001",   # String contains ambiguous {}. Did you mean {}?
  "RUF002",   # Docstring contains ambiguous {}. Did you mean {}?
  "RUF003",   # Comment contains ambiguous {}. Did you mean {}?
  "RUF007",   # Prefer itertools.pairwise() over zip() when iterating over successive pairs
  "S101",     # Use of `assert` detected -- DO NOT FIX
  "S113",     # Probable use of requests call without timeout -- FIX ME
  "S311",     # Standard pseudo-random generators are not suitable for cryptographic purposes -- FIX ME
  "SLF001",   # Private member accessed: `_Iterator` -- FIX ME
  "UP038",    # Use `X | Y` in `{}` call instead of `(X, Y)` -- DO NOT FIX
]
lint.select = [  # https://beta.ruff.rs/docs/rules
  "A",      # flake8-builtins
  "ARG",    # flake8-unused-arguments
  "ASYNC",  # flake8-async
  "B",      # flake8-bugbear
  "BLE",    # flake8-blind-except
  "C4",     # flake8-comprehensions
  "C90",    # McCabe cyclomatic complexity
  "DJ",     # flake8-django
  "DTZ",    # flake8-datetimez
  "E",      # pycodestyle
  "EM",     # flake8-errmsg
  "EXE",    # flake8-executable
  "F",      # Pyflakes
  "FA",     # flake8-future-annotations
  "FLY",    # flynt
  "G",      # flake8-logging-format
  "I",      # isort
  "ICN",    # flake8-import-conventions
  "INP",    # flake8-no-pep420
  "INT",    # flake8-gettext
  "ISC",  # flake8-implicit-str-concat
  "N",      # pep8-naming
  "NPY",    # NumPy-specific rules
  "PD",   # pandas-vet
  "PGH",    # pygrep-hooks
  "PIE",    # flake8-pie
  "PL",     # Pylint
  "PT",   # flake8-pytest-style
  "PYI",    # flake8-pyi
  "RSE",    # flake8-raise
  "RUF",    # Ruff-specific rules
  "S",      # flake8-bandit
  "SIM",    # flake8-simplify
  "SLF",    # flake8-self
  "T10",    # flake8-debugger
  "TD",     # flake8-todos
  "TID",    # flake8-tidy-imports
  "UP",     # pyupgrade
  "W",      # pycodestyle
  "YTT",    # flake8-2020
  # "ANN",  # flake8-annotations  # FIX ME?
  # "COM",  # flake8-commas
  # "D",    # pydocstyle -- FIX ME?
  # "ERA",  # eradicate -- DO NOT FIX
  # "FBT",  # flake8-boolean-trap  # FIX ME
  # "PTH",  # flake8-use-pathlib  # FIX ME
  # "Q",    # flake8-quotes
  # "RET",  # flake8-return  # FIX ME?
  # "T20",  # flake8-print
  # "TCH",  # flake8-type-checking
  # "TRY",  # tryceratops
]
output-format = "full"
target-version = "py312"

[tool.ruff.lint.mccabe]   # DO NOT INCREASE THIS VALUE
max-complexity = 17  # default: 10

[tool.ruff.lint.per-file-ignores]
"arithmetic_analysis/newton_raphson.py" = ["PGH001"]
"audio_filters/show_response.py" = ["ARG002"]
"data_structures/binary_tree/binary_search_tree_recursive.py" = ["BLE001"]
"data_structures/binary_tree/treap.py" = ["SIM114"]
"data_structures/hashing/hash_table.py" = ["ARG002"]
"data_structures/hashing/quadratic_probing.py" = ["ARG002"]
"data_structures/hashing/tests/test_hash_map.py" = ["BLE001"]
"data_structures/heap/max_heap.py" = ["SIM114"]
"graphs/minimum_spanning_tree_prims.py" = ["SIM114"]
"hashes/enigma_machine.py" = ["BLE001"]
"machine_learning/decision_tree.py" = ["SIM114"]
"machine_learning/linear_discriminant_analysis.py" = ["ARG005"]
"machine_learning/sequential_minimum_optimization.py" = ["SIM115"]
"matrix/sherman_morrison.py" = ["SIM103", "SIM114"]
"other/l*u_cache.py" = ["RUF012"]
"physics/newtons_second_law_of_motion.py" = ["BLE001"]
"project_euler/problem_099/sol1.py" = ["SIM115"]
"sorts/external_sort.py" = ["SIM115"]

[tool.ruff.lint.pylint]   # DO NOT INCREASE THESE VALUES
allow-magic-value-types = ["float", "int", "str"]
max-args = 10        # default: 5
max-branches = 20    # default: 12
max-returns = 8      # default: 6
max-statements = 88  # default: 50

[tool.codespell]
ignore-words-list = "3rt,ans,bitap,crate,damon,fo,followings,hist,iff,kwanza,manuel,mater,secant,som,sur,tim,toi,zar"
skip = "./.*,*.json,ciphers/prehistoric_men.txt,project_euler/problem_022/p022_names.txt,pyproject.toml,strings/dictionary.txt,strings/words.txt"

[tool.pytest.ini_options]
markers = [
    "mat_ops: mark a test as utilizing matrix operations.",
]
addopts = [
    "--durations=10",
    "--doctest-modules",
    "--showlocals",
]

[tool.coverage.report]
omit = [
  ".env/*",
  "project_euler/*"
]
sort = "Cover"
